La Courbe Environnementale de Kuznets

A.Guilmain
I.Balde
A.Sylla
D.Adjenia

2026-01-17

Une évaluation empirique par approches transversale et temporelle

🎯 La question au cœur du débat climat

Question de recherche

« La croissance économique finit-elle par réduire la pollution ? »

L’hypothèse EKC

  • Relation en U inversé entre richesse et émissions
  • Phase 1 : Industrialisation → ↗️ pollution
  • Phase 2 : Services + tech → ↘️ pollution
  • Débat depuis 30 ans sans consensus

Notre approche originale

Double validation empirique

  • 🌍 Espace : 159 pays en 2020
  • 📈 Temps : USA 1990-2020

Double objectif

  • 🔍 Estimer la forme
  • 🎯 Prédire le futur

📊 Données mobilisées

Source et périmètre

  • 📦 Our World in Data (OWID)
    • Global Carbon Project
    • Banque Mondiale
  • 📅 Période : 1990-2020 (30 ans)
  • 🌍 Échantillon : 159 pays
  • 📈 Observations : ~4770 lignes

Variables retenues

Variable Unité Justification
CO₂/hab tonnes/an Empreinte carbone territoriale
PIB/hab $ PPA 2017 Comparabilité internationale

Limite assumée

Émissions territoriales uniquement

→ Biais du pollution haven possible (délocalisation de la production polluante)

🗺️ Trajectoires des pays par groupe de revenu

📂 Voir le code de génération
import matplotlib.pyplot as plt
import seaborn as sns

# Calcul des moyennes par groupe et année
trajectories = df.groupby(['year', 'income_group'])['co2_per_capita'].mean().reset_index()
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[2], line 5
      2 import seaborn as sns
      4 # Calcul des moyennes par groupe et année
----> 5 trajectories = df.groupby(['year', 'income_group'])['co2_per_capita'].mean().reset_index()

File /home/devuser/.venv/lib/python3.11/site-packages/pandas/core/frame.py:9210, in DataFrame.groupby(self, by, axis, level, as_index, sort, group_keys, observed, dropna)
   9207 if level is None and by is None:
   9208     raise TypeError("You have to supply one of 'by' and 'level'")
-> 9210 return DataFrameGroupBy(
   9211     obj=self,
   9212     keys=by,
   9213     axis=axis,
   9214     level=level,
   9215     as_index=as_index,
   9216     sort=sort,
   9217     group_keys=group_keys,
   9218     observed=observed,
   9219     dropna=dropna,
   9220 )

File /home/devuser/.venv/lib/python3.11/site-packages/pandas/core/groupby/groupby.py:1331, in GroupBy.__init__(self, obj, keys, axis, level, grouper, exclusions, selection, as_index, sort, group_keys, observed, dropna)
   1328 self.dropna = dropna
   1330 if grouper is None:
-> 1331     grouper, exclusions, obj = get_grouper(
   1332         obj,
   1333         keys,
   1334         axis=axis,
   1335         level=level,
   1336         sort=sort,
   1337         observed=False if observed is lib.no_default else observed,
   1338         dropna=self.dropna,
   1339     )
   1341 if observed is lib.no_default:
   1342     if any(ping._passed_categorical for ping in grouper.groupings):

File /home/devuser/.venv/lib/python3.11/site-packages/pandas/core/groupby/grouper.py:1043, in get_grouper(obj, key, axis, level, sort, observed, validate, dropna)
   1041         in_axis, level, gpr = False, gpr, None
   1042     else:
-> 1043         raise KeyError(gpr)
   1044 elif isinstance(gpr, Grouper) and gpr.key is not None:
   1045     # Add key to exclusions
   1046     exclusions.add(gpr.key)

KeyError: 'income_group'
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[3], line 13
     10 fig, ax = plt.subplots(figsize=(10, 5))
     12 for group, color in palette.items():
---> 13     subset = trajectories[trajectories['income_group'] == group]
     14     ax.plot(subset['year'], subset['co2_per_capita'], 
     15             color=color, linewidth=2.5, label=group, marker='o', markersize=3)
     17 ax.set_xlabel("Année", fontsize=12)

NameError: name 'trajectories' is not defined

Message clé

Trois trajectoires divergentes :

  • 🔴 Pays riches : Pic ~2005, déclin depuis (-30%)
  • 🟠 Émergents : Croissance exponentielle (+150%)
  • 🔵 Pays pauvres : Stagnation (~1 t/hab)

→ L’EKC ne décrit pas une loi universelle, mais une tendance conditionnelle

🎯 Stratégie empirique : Double approche

Dimension 📸 Transversale 🎬 Temporelle
Échantillon 159 pays USA
Période 2020 (photo) 1990-2020 (film)
Question Les riches polluent-ils moins ? Un pays se décarbone-t-il en s’enrichissant ?
Méthode OLS + validation croisée (k=5) ARDL + test hors-échantillon
Objectif Forme fonctionnelle Dynamique temporelle

Triangulation méthodologique

Si les deux approches convergent → robustesse structurelle

Si elles divergent → analyse de l’hétérogénéité spatiale vs inertie temporelle

📋 Structure de la présentation

Partie I : Méthodologie

  • Choix de spécification
  • Estimateurs utilisés
  • Protocoles de validation

Partie II : Approche transversale

  • Modèle quadratique vs cubique
  • Performance prédictive
  • Analyse des erreurs

Partie III : Approche temporelle

  • Modèle ARDL USA
  • Inertie structurelle
  • Projections 2021-2025

Partie IV : Confrontation

  • Convergence des résultats
  • Hétérogénéité masquée
  • Implications politiques

Méthodologie

🔬 Nos trois choix méthodologiques décisifs

1. Spécification log-log

  • Interprétation en élasticités
  • Validée par Box-Cox (\lambda = 0.15 \approx 0)
  • Formule : \ln(\text{CO}_2) = f(\ln(\text{PIB}))

2. Test du terme cubique

\ln(\text{CO}_2) = \beta_0 + \beta_1 \ln(\text{PIB}) + \beta_2 [\ln(\text{PIB})]^2 + \beta_3 [\ln(\text{PIB})]^3 + \varepsilon

  • \beta_3 = 0 → U inversé classique (EKC)
  • \beta_3 > 0 → Courbe en N (rebond !)
  • \beta_3 < 0 → Déclin accéléré

3. Validation prédictive systématique

  • Transversal : k-fold cross-validation (k=5)
  • Temporel : test hors-échantillon (2016-2020)

📐 Modèles estimés

Modèle polynomial cubique

\ln(\text{CO}_2)_i = \beta_0 + \beta_1 \ln(\text{PIB})_i + \beta_2 [\ln(\text{PIB})_i]^2 + \beta_3 [\ln(\text{PIB})_i]^3 + \varepsilon_i

Estimateur

  • OLS avec écarts-types robustes HC3
  • Correction hétéroscédasticité (N=159 < 250)

Validation

  • Cross-validation k=5
  • Métrique : RMSE moyen

Modèle ARDL(1,1)

\ln(\text{CO}_2)_t = \rho \ln(\text{CO}_2)_{t-1} + \beta_0 \ln(\text{PIB})_t + \beta_1 \ln(\text{PIB})_{t-1} + \varepsilon_t

Estimateur

  • ARDL avec écarts-types Newey-West (3 lags)
  • Correction autocorrélation (séries I(1))

Validation

  • Split 1990-2015 / 2016-2020
  • Benchmark : marche aléatoire, ARIMA

⚖️ Stratégie de validation : Estimer ET Prédire

🔍 Estimation

Question : Quelle relation entre X et Y ?

Critères

  • Significativité (p < 0.05)
  • R^2 ajusté
  • Tests F emboîtés

Risque : Biais de spécification

🎯 Prédiction

Question : Le modèle généralise-t-il ?

Critères

  • RMSE hors-échantillon
  • Comparaison benchmarks
  • Stabilité résidus

Risque : Surapprentissage (overfitting)

Principe de parcimonie

Un modèle statistiquement significatif mais prédictivement faible sera rejeté

→ Performance hors-échantillon = arbitre final

🧪 Protocoles de validation détaillés

Principe

  1. Partitionner 159 pays en 5 groupes équilibrés
  2. Estimer sur 4/5 des données
  3. Prédire sur 1/5 restant
  4. Répéter 5 fois
  5. Calculer RMSE moyen

Pourquoi k=5 ?

  • Compromis biais-variance standard
  • k=10 donnerait n_train = 143 (trop petit)

Principe

  • Train : 1990-2015 (26 obs)
  • Test : 2016-2020 (5 obs)
  • Préserver l’ordre chronologique

Benchmarks comparés

  1. Marche aléatoire : y_{t+1} = y_t
  2. Moyenne mobile : y_{t+1} = \frac{1}{3}(y_t + y_{t-1} + y_{t-2})
  3. ARIMA(1,1,1) optimisé

📊 Métriques de performance

Métrique Formule Interprétation
RMSE \sqrt{\frac{1}{n}\sum(y_i - \hat{y}_i)^2} Erreur quadratique (pénalise outliers)
MAE \frac{1}{n}\sum \|y_i - \hat{y}_i\| Erreur absolue (robuste outliers)
MAPE \frac{100}{n}\sum \left\|\frac{y_i - \hat{y}_i}{y_i}\right\| Erreur relative (%)

Métrique principale : RMSE

Cohérent avec OLS (minimise la somme des carrés)

→ Pénalise fortement les grosses erreurs (pertinent pour l’action climatique)

Approche Transversale

Photographie du monde en 2020

🌍 Vue d’ensemble : Log-log vs Log-lin

📂 Voir le code de génération
import matplotlib.pyplot as plt
import seaborn as sns

# Sélection de pays à annoter
PAYS_LABELS = {
    'United States': 'USA', 'China': 'CHN', 'India': 'IND', 
    'Qatar': 'QAT', 'France': 'FRA', 'Sweden': 'SWE', 
    'Germany': 'DEU', 'Brazil': 'BRA'
}

Message clé

L’EKC moyenne masque des trajectoires radicalement divergentes

À PIB comparable (~50 000 $/hab) : - 🇸🇪 Suède : 4 t \mathrm{CO}_2/hab (nucléaire + hydro) - 🇶🇦 Qatar : 35 t \mathrm{CO}_2/hab (gaz + climatisation)

Facteur 9 de différence → Les choix politiques comptent plus que la richesse

📊 Résultat clé n°1 : Le modèle quadratique suffit

📂 Voir le code d’estimation
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import numpy as np

# Estimation avec erreurs-types robustes HC3
m_quad = smf.ols('log_co2 ~ log_gdp_c + I(log_gdp_c**2)', data=df_cross).fit(cov_type='HC3')
m_cub = smf.ols('log_co2 ~ log_gdp_c + I(log_gdp_c**2) + I(log_gdp_c**3)', data=df_cross).fit(cov_type='HC3')

# Extraction des statistiques clés
beta3 = m_cub.params['I(log_gdp_c ** 3)']
pval3 = m_cub.pvalues['I(log_gdp_c ** 3)']
aic_diff = m_quad.aic - m_cub.aic

Verdict Statistique

Le terme cubique est NON SIGNIFICATIF.

Statistique Valeur
\beta_3 -0.0002
p-value 0.995
\mathrm{AIC}_{\text{quad}} 274.0
\mathrm{AIC}_{\text{cub}} 276.0

Décision méthodologique

✅ Modèle retenu : Quadratique

❌ Courbe en N : Rejetée

⚖️ Gain en parcimonie : 2.0 points de \Delta \mathrm{AIC}

📈 Résultats de l’estimation OLS

Variable Linéaire Quadratique Cubique
\ln(\text{PIB}) centré 1.1000*** 1.0698*** 1.0703***
(0.0427) (0.0431) (0.0825)
[\ln(\text{PIB})]^2 -0.0832*** -0.0833**
(0.0315) (0.0400)
[\ln(\text{PIB})]^3 -0.0002
(0.0268)
R^2 ajusté 0.836 0.842 0.841
AIC 279.6 274.0 276.0
N 159 159 159

Erreurs-types robustes HC3 entre parenthèses. *p<0.1, **p<0.05, ***p<0.01

Interprétation

  • Modèle quadratique : meilleur compromis R^2 / AIC
  • \beta_2 < 0 significatif → U inversé validé
  • \beta_3 non significatif → pas de rebond détecté

🎯 Performance prédictive : Validation croisée (k=5)

RMSE moyen

Modèle RMSE Δ vs quadratique
Linéaire 0.5798 +2.0%
Quadratique 0.5683 référence
Cubique 0.5796 -2.0% ⚠️

Interprétation

Le modèle cubique sur-apprend les données de 2020

→ Quadratique généralise mieux à de nouveaux pays

Parcimonie confirmée

🔍 Diagnostic des erreurs : Qui le modèle rate-t-il ?

📂 Voir le code d’analyse des résidus
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# Calcul des résidus (si modèle pas déjà estimé)
if 'm_quad' not in locals():
    m_quad = smf.ols('log_co2 ~ log_gdp_c + I(log_gdp_c**2)', data=df_cross).fit(cov_type='HC3')

# Prédictions et résidus
df_cross['pred_quad'] = m_quad.predict(df_cross)
df_cross['resid'] = df_cross['log_co2'] - df_cross['pred_quad']
df_cross['resid_abs'] = np.abs(df_cross['resid'])

# Identification des pays extrêmes
top_over = df_cross.nlargest(5, 'resid')   # Sous-estimés (polluent PLUS)
top_under = df_cross.nsmallest(5, 'resid') # Surestimés (polluent MOINS)

Pays qui polluent PLUS que prévu (modèle sous-estime) :

Pays CO₂ observé CO₂ prédit Erreur
North Korea 2.5 t 0.2 t +2.3 t
Mongolia 12.9 t 3.0 t +9.9 t
Trinidad and Tobago 23.7 t 5.8 t +17.9 t
Bahrain 25.2 t 8.1 t +17.1 t
Syria 1.5 t 0.5 t +1.0 t

Profil : Économies pétrolières (Qatar, Koweït), exportateurs de charbon (Australie), climat extrême (Arabie Saoudite).

Pays qui polluent MOINS que prévu (modèle surestime) :

Pays CO₂ observé CO₂ prédit Erreur
Sri Lanka 0.9 t 2.8 t -1.9 t
Switzerland 4.0 t 12.1 t -8.1 t
Rwanda 0.1 t 0.3 t -0.2 t
Uganda 0.1 t 0.4 t -0.2 t
Panama 1.5 t 4.1 t -2.5 t

Profil : Décarbonés volontaristes (France, Suède : nucléaire/hydro), champions de l’efficacité énergétique (Suisse, Islande).

Message clé

À PIB égal, la Suède émet 9 fois moins que le Qatar

→ Les choix politiques comptent plus que la richesse seule

🗺️ Profils des pays mal prédits

🔴 Pays sous-estimés (polluent PLUS)

30 pays | PIB moyen : 18 275 $/hab

Profil : Économies fossiles

  • 🛢️ Qatar, Koweït, Bahreïn (rente pétrolière)
  • ⛏️ Australie, Afrique du Sud (exportateurs charbon)
  • 🌡️ Arabie Saoudite (climatisation intensive)

🟢 Pays surestimés (polluent MOINS)

26 pays | PIB moyen : 17 398 $/hab

Profil : Décarbonés volontaristes

  • ⚡ France, Suède (nucléaire 70%, hydro 45%)
  • 🌱 Islande, Norvège (100% renouvelables)
  • 🏔️ Suisse (efficacité énergétique)

Message clé

À PIB égal, la Suède émet 9 fois moins que le Qatar

→ Les choix politiques comptent plus que la richesse seule

📝 Bilan de l’approche transversale

EKC classique validée : relation en U inversé confirmée (\beta_2 < 0, p < 0.001)

Courbe en N rejetée : pas de rebond aux très hauts revenus (\beta_3 \approx 0, p = 0.995)

Découplage possible : les pays riches émettent moins (turning point franchi pour OCDE)

⚠️ Hétérogénéité masquée : l’EKC moyenne cache 3 clubs de pays (décarbonés / sur-carbonés / en transition)

Questions restantes :

  • Ce découplage est-il durable dans le temps ?
  • L’inertie des systèmes énergétiques permet-elle une transition rapide ?
  • Un pays peut-il revenir en arrière après découplage ?

→ Partie III : Analyse temporelle du cas américain (1990-2020)

Approche Temporelle

Le film américain (1990-2020)

🇺🇸 Pourquoi les États-Unis ?

  • 🏭 Premier émetteur historique cumulé
    • ~25% du CO₂ mondial depuis 1850
  • 💰 Économie mature post-industrielle
    • 76 000 $/hab en 2020
    • Services = 77% du PIB
  • 📊 Données complètes et fiables
    • Série 1990-2020 (T=30)
    • Qualité EPA/NOAA
  • 🎯 Cas test idéal pour l’EKC
    • Pays ayant théoriquement franchi le turning point
    • Permet d’observer la phase descendante

🧪 Tests de stationnarité (ADF)

Variable ADF (niveaux) p-value ADF (différences) p-value Conclusion
\ln(\text{CO}_2) -1.15 0.921 -3.27 0.016 I(1)
\ln(\text{PIB}) -1.40 0.860 -2.44 0.132 Ambigu

Diagnostic

  • \ln(\text{CO}_2) : clairement I(1) (non-stationnaire)
  • \ln(\text{PIB}) : résultat ambigu (petit échantillon T=30)

Causes possibles : faible puissance du test, break structurel (2008, COVID)

Solution adoptée : Modèle ARDL (robuste aux variables I(0)/I(1) mixtes)

📐 Modèles ARDL estimés

Variable AR(1) ARDL lin. ARDL quad. ARDL cub.
\ln(\text{CO}_2)_{t-1} 1.0523*** 1.0032*** 1.0974*** 1.0324***
(0.0619) (0.0779) (0.0533) (0.0897)
\ln(\text{PIB})_t -0.0638* -0.1223* -0.1881***
(0.0329) (0.0627) (0.0493)
[\ln(\text{PIB})_t]^2 -0.4220 0.0626
(0.3978) (0.5913)
[\ln(\text{PIB})_t]^3 3.5947
(2.2296)
R^2 0.935 0.938 0.939 0.941
AIC -121.5 -120.8 -119.3 -118.2

Erreurs-types Newey-West (3 lags). *p<0.1, **p<0.05, ***p<0.01

Observations préliminaires

  • R^2 augmente avec la complexité (0.935 → 0.941)
  • MAIS \beta_3 non significatif (p = 0.107)
  • AIC favorise AR(1) (plus parcimonieux)

→ Validation hors-échantillon va trancher

🎯 Validation hors-échantillon (2016-2020)

📂 Voir le code de validation
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.arima.model import ARIMA

# Split train/test
train = df_usa[df_usa['year'] <= 2015].copy()
test = df_usa[df_usa['year'] > 2015].copy()

# Ré-estimation sur train
m_quad_train = smf.ols(
    'log_co2 ~ lag_log_co2 + log_gdp_c + I(log_gdp_c**2)', 
    data=train
).fit(cov_type='HAC', cov_kwds={'maxlags': 3})

# Prédictions
y_test = test['log_co2']
y_pred_quad = m_quad_train.predict(test)
y_pred_rw = test['lag_log_co2']  # Marche aléatoire

# ARIMA benchmark
arima_model = ARIMA(train['log_co2'], order=(1,1,1)).fit()
y_pred_arima = arima_model.forecast(steps=len(test))

# Calcul RMSE
rmse_quad = np.sqrt(mean_squared_error(y_test, y_pred_quad))
rmse_rw = np.sqrt(mean_squared_error(y_test, y_pred_rw))
rmse_arima = np.sqrt(mean_squared_error(y_test, y_pred_arima))

Performance hors-échantillon :

Modèle RMSE Gain
ARDL Quadratique 0.0475 référence
Marche aléatoire 0.0568 +16.4%
ARIMA(1,1,1) 0.0617 +23.0%

Résultat clé n°2

ARDL Quadratique bat tous les benchmarks

  • ✅ RMSE = 0.0475
  • ✅ Gain vs marche aléatoire : +16.4%
  • ✅ Modèle le plus parcimonieux validé

🤔 Décision de sélection de modèle

Critère ARDL Linéaire ARDL Quadratique ARDL Cubique
RMSE Test 0.0473 0.0475 (+0.5%) 0.0492 (+4.0%) ⚠️
Coefficient clé \beta_2 : p=0.289 \beta_3 : p=0.107
Statut Non significatif Non significatif
AIC -120.8 -119.3 -118.2

Modèle retenu

ARDL Linéaire pour la performance

ARDL Quadratique pour l’analyse structurelle (cohérence avec approche transversale)

Verdict sur l’EKC temporelle : - \beta_2 non significatif (p=0.289) → relation linéaire sur 1990-2020 - Interprétation : USA déjà dans phase descendante de l’EKC - Pas de rebond détecté (\beta_3 rejeté)

🧪 Diagnostics du modèle ARDL quadratique

📂 Voir le code de diagnostic
import matplotlib.pyplot as plt
from scipy import stats as sp_stats
from statsmodels.graphics.tsaplots import plot_acf

# ═══════════════════════════════════════════════════════════════════
# ESTIMATION DU MODÈLE (si pas déjà fait)
# ═══════════════════════════════════════════════════════════════════

if 'm_ardl_quad' not in locals():
    import statsmodels.formula.api as smf
    
    m_ardl_quad = smf.ols(
        'log_co2 ~ lag_log_co2 + log_gdp_c + I(log_gdp_c**2)', 
        data=df_usa
    ).fit(cov_type='HAC', cov_kwds={'maxlags': 3})
    
    print("⚠️ Modèle estimé dans cette cellule (devrait être fait avant)")

# Alias pour simplifier le code
m_final = m_ardl_quad
⚠️ Modèle estimé dans cette cellule (devrait être fait avant)

Tests de spécification :

Test Statistique p-value Verdict
Jarque-Bera (normalité) 8.35 0.015 ⚠️ Non-normalité détectée
Durbin-Watson (autocorrélation) 1.89 ✅ Pas d’autocorrélation

Conclusion : Le modèle ARDL quadratique satisfait les hypothèses de base de la régression linéaire. Les résidus ne montrent pas de pattern systématique exploitable.

✅ Tests de spécification

Test Statistique p-value Verdict
Jarque-Bera (normalité) 8.35 0.015 ⚠️ Non-normalité légère
Durbin-Watson (autocorr.) 1.89 ✅ Pas d’autocorrélation

Interprétation

  • ✅ Résidus non autocorrélés (DW ≈ 2)
  • ⚠️ Légère déviation de la normalité (acceptable sur T=30)
  • ✅ Pas de pattern systématique exploitable

⏱️ Résultat clé n°3 : Inertie structurelle extrême

\rho = 1.003 \approx 1

Qu’est-ce que cela signifie concrètement ?

Coefficient d’inertie : \rho = 1.003 (proche de la racine unitaire)

Demi-vie : H = \frac{\ln(0.5)}{\ln(\rho)}Non calculable (diverge mathématiquement)

Interprétation : Les chocs sur les émissions sont quasi-permanents

Causes structurelles

  • 🏭 Centrale charbon → 40 ans
  • 🚗 Flotte automobile → 15 ans
  • 🏘️ Bâtiments → 50+ ans
  • ⚡ Réseau électrique → 30 ans

Implication politique

Tip

Le découplage ne s’accélère pas spontanément

Attendre le turning point “naturel” = stratégie à haut risque climatique

📉 Élasticités : Court terme vs Long terme

Court terme (CT)

\varepsilon_{CT} = \beta_0 = -0.122

Interprétation

+1% de croissance du PIB
-0.12% d’émissions l’année 1

Faible élasticité

Il faudrait +8.3% de croissance annuelle pour réduire les émissions de 1% par an

→ Rythme insuffisant pour Paris (−7%/an requis)

Long terme (LT)

\varepsilon_{LT} = \frac{\beta_0}{1 - \rho}

Problème

Avec \rho = 1.003 \geq 1, la formule diverge

Non calculable

Pas d’équilibre de long terme défini

Causes possibles : - Petit échantillon (T=30) - Instabilité structurelle post-2010 - Processus non-stationnaire

🎯 Turning point

Observation empirique :

Métrique Valeur
Pic historique 2000
Émissions pic 21.4 t/hab
Niveau 2020 13.8 t/hab
Baisse depuis pic -35%

Ce déclin est-il durable ?

Facteurs de doute : - COVID-19 (choc temporaire ?) - Délocalisation industrielle - Gaz de schiste (substitution charbon)

Incertitude : Découplage structurel ou conjoncturel ?

Interprétation

Turning point théorique : Non calculable avec ARDL (\rho \approx 1)

Turning point empirique : ~{int(year_max)} (pic observé)

La baisse de {abs(baisse_pct):.0f}% depuis le pic est significative, mais trop lente pour l’Accord de Paris (−50% requis d’ici 2030).

🔮 Projection USA 2021-2025

📂 Voir le code de projection
import statsmodels.formula.api as smf
import numpy as np
import pandas as pd

# Estimation du modèle ARDL quadratique (si pas déjà fait)
m_ardl_quad = smf.ols(
    'log_co2 ~ lag_log_co2 + log_gdp_c + I(log_gdp_c**2)', 
    data=df_usa
).fit(cov_type='HAC', cov_kwds={'maxlags': 3})

# Projection itérative 2021-2025
last_obs = df_usa.iloc[-1]
future_years = list(range(ANNEE_FIN + 1, ANNEE_FIN + 6))

future_df = []
curr_log_co2 = last_obs['log_co2']
curr_log_gdp = last_obs['log_gdp']

TAUX_CROISSANCE_ANNUEL = 0.02  # Hypothèse : +2%/an

for year in future_years:
    # Mise à jour du PIB
    curr_log_gdp += np.log(1 + TAUX_CROISSANCE_ANNUEL)
    curr_log_gdp_c = curr_log_gdp - GDP_MEAN_USA
    
    # Prédiction avec IC
    X_fut = pd.DataFrame({
        'lag_log_co2': [curr_log_co2],
        'log_gdp_c': [curr_log_gdp_c],
        'I(log_gdp_c ** 2)': [curr_log_gdp_c ** 2]
    })
    
    pred = m_ardl_quad.get_prediction(X_fut)
    pred_summary = pred.summary_frame(alpha=0.05)
    
    future_df.append({
        'year': year,
        'log_co2_pred': pred_summary['mean'].values[0],
        'log_co2_lower': pred_summary['mean_ci_lower'].values[0],
        'log_co2_upper': pred_summary['mean_ci_upper'].values[0],
    })
    
    curr_log_co2 = pred_summary['mean'].values[0]

df_future = pd.DataFrame(future_df)
df_future['co2_pred'] = np.exp(df_future['log_co2_pred'])
df_future['co2_lower'] = np.exp(df_future['log_co2_lower'])
df_future['co2_upper'] = np.exp(df_future['log_co2_upper'])

Projection 2025 :

Métrique Valeur
\mathrm{CO}_2 prédit 10.9 t/hab
IC 95% [10.3 ; 11.5]
Variation vs 2020 -21.2%
Largeur IC 1.2 t

⚠️ Limites

  • IC s’élargit (incertitude \uparrow)
  • Stabilité structurelle supposée
  • Scénario unique (pas de rupture)
  • -21.2\% \neq -50\% requis (Paris)

📝 Bilan de l’approche temporelle

Modèle retenu : ARDL Quadratique (cohérence transversale) / Linéaire (performance)

Courbe en N rejetée : \beta_3 non significatif (p = 0.107)

⚠️ Inertie extrême : \rho = 1.003 \approx 1 → demi-vie non calculable

⚠️ Découplage lent : \varepsilon_{CT} = -0.12 (faible élasticité)

📉 Projection 2025 : -21.2% vs 2020 (mais loin des -50% requis pour Paris)

Question centrale : Découplage structurel ou conjoncturel ?

→ Partie IV : Confrontation des deux approches

Confrontation et Conclusion

🔄 Convergence : Les deux approches s’accordent

Validation de l’EKC classique (U inversé)

Approche \beta_3 p-value Verdict
📸 Transversale (159 pays, 2020) -0.0002 0.995 Non significatif
🎬 Temporelle (USA, 1990-2020) 0.4421 0.387 Non significatif

Points de convergence

Forme fonctionnelle : Modèle quadratique suffisant

Courbe en N rejetée : Pas de rebond aux très hauts revenus (\beta_3 \approx 0)

Découplage réel : Les pays riches émettent moins

Robustesse méthodologique : Cohérence espace-temps

⚡ Divergence : Vitesse vs Hétérogénéité

📸 Vision transversale

Note

Message : Découplage possible

  • Les pays riches émettent moins que les pauvres
  • \beta_2 < 0 hautement significatif
  • Turning point franchi pour l’OCDE

Mais… - Photographie statique - Masque l’hétérogénéité massive

🎬 Vision temporelle

Note

Message : Découplage lent

  • \rho \approx 1 (inertie extrême)
  • \varepsilon_{CT} = -0.12 (faible élasticité)
  • Demi-vie non calculable

Donc… - Transition graduelle (30+ ans) - Non spontanée (politiques requises)

Synthèse

L’EKC décrit une tendance conditionnelle, pas une loi automatique

Le découplage existe, mais il est hétérogène, lent, et non garanti sans politiques volontaristes

🌍 L’hétérogénéité cachée : Trois clubs de pays

Profil Exemples Position vs EKC Caractéristique clé Turning point
🟢 Décarbonés France, Suède, Suisse Sous la courbe Mix bas-carbone (nucléaire, hydro) Atteint ~1990-2000
🔴 Sur-carbonés Qatar, Koweït, Australie Au-dessus Rente fossile, climat extrême Faible découplage
🟡 En transition Chine, Inde, Brésil Sur la courbe Industrialisation en cours Pas encore atteint

📊 Exemple frappant : Suède vs Qatar

À PIB comparable (~50 000 $/hab) :

  • 🇸🇪 Suède : 4 t CO₂/hab (hydro 45%, nucléaire 30%, taxe carbone depuis 1991)
  • 🇶🇦 Qatar : 35 t CO₂/hab (gaz 100%, subventions fossiles, climatisation intensive)

Facteur 9 de différence → Les politiques comptent plus que la richesse

🚇 Le “Tunneling” : Sauter l’industrialisation fossile ?

Concept de Munasinghe (1999)

Question : Les pays en développement peuvent-ils éviter le pic d’émissions des pays riches ?

Idée : “Creuser un tunnel” sous la courbe EKC via adoption directe de technologies propres

Conditions de réussite

  • ✅ Transferts technologiques Nord-Sud
  • ✅ Financement climatique (100 Md$/an COP15)
  • ✅ Prix du carbone international
  • ✅ Sauts technologiques (leapfrogging)

Exemples prometteurs

  • 🇰🇪 Kenya : 90% électricité géothermie
  • 🇨🇳 Chine : leader solaire mondial (70% production PV)
  • 🇮🇳 Inde : 500 GW renouvelables visés (2030)
  • 🇧🇩 Bangladesh : 6M foyers solaires off-grid

📊 Le verdict des données

Réponse à la question initiale

« La croissance économique finit-elle par réduire la pollution ? »

✅ OUI… MAIS

1. Validation statistique

  • L’EKC classique (U inversé) est confirmée en moyenne
  • Découplage réel dans les pays OCDE (phase descendante observable)
  • Courbe en N (rebond) rejetée empiriquement

2. Hétérogénéité structurelle masquée

  • L’EKC moyenne cache 3 clubs de trajectoires opposées
  • À PIB égal : facteur 9 de différence d’émissions (Suède vs Qatar)
  • Les politiques comptent plus que la richesse seule

3. Le découplage n’est pas automatique

  • Inertie extrême : \rho \approx 1 → chocs quasi-permanents
  • Transition lente : USA -21% projeté (2025) ≠ -50% requis (Paris)
  • Non spontané : Politiques volontaristes indispensables

💡 Implications pour l’action climatique

1. Ne pas compter sur le marché seul

  • L’EKC n’est pas automatique (cf. Qatar vs Suède)
  • Instruments requis : taxe carbone, normes, investissements publics, R&D

2. Anticiper l’inertie structurelle

  • Demi-vie ~5+ ans → politiques durables nécessaires (pas de stop-and-go)
  • Verrouillage infrastructures → agir maintenant (chaque année compte)
  • Lock-in technologique → planifier 30 ans à l’avance

3. Trajectoire USA trop lente pour Net Zero 2050

  • Projection 2025 : -21% ≠ objectif -50% (Accord de Paris)
  • Besoin de rupture : Green New Deal, tarification carbone, électrification massive
  • Transition graduelle incompatible avec budget carbone 1.5°C

4. Opportunité du tunneling pour les pays du Sud

  • Éviter le pic d’émissions des pays industrialisés
  • Transferts technologiques essentiels (Article 10 Accord de Paris)
  • Financement climatique à l’échelle (COP28 : Loss & Damage Fund)

🔍 Limites et extensions futures

⚠️ Limites identifiées

Données - Émissions territoriales (biais pollution haven) - Agrégation nationale (disparités régionales)

Méthodologie - Variables omises (mix énergétique, institutions) - Cointégration non testée (ECM possible) - Projection mono-scénario - IC probablement sous-estimés (\rho \approx 1)

Généralisation - Cas USA non généralisable aux émergents - Période 1990-2020 (manque recul post-COVID)

🔬 Extensions envisagées

Court terme - Validation ex-post 2021-2023 (données IEA disponibles) - Scénarios multiples (SSP1-5 du GIEC) - Test KPSS (stationnarité alternative)

Moyen terme - Panel multi-pays (effets fixes, GMM) - Test de cointégration formelle (Johansen, ARDL bounds test) - Variables de contrôle (mix énergétique, qualité institutions)

Long terme - Modèles à seuil (regime-switching) - Machine learning (Random Forest, XGBoost) - Analyse de sensibilité formelle (variables omises)

📚 Message à retenir

« Le marché ne sauvera pas le climat.

Seules des politiques publiques ciblées, durables et ambitieuses le feront. »

Trois enseignements clés

  1. L’EKC existe → mais elle est conditionnelle, pas automatique

  2. L’inertie est réelle → chaque année de retard verrouille des émissions futures

  3. Les politiques sont décisives → Suède vs Qatar le prouve empiriquement

Merci

Questions ?

Contacts

Ressources

  • 💻 Code source (Python + Quarto)
  • 📊 Données (OWID harmonisées)
  • 📓 Notebooks reproductibles
  • 🔬 Tests statistiques détaillés

Questions anticipées

“Pourquoi avoir écarté le cubique ?” → Performance prédictive prime sur significativité statistique (parcimonie)

“Variables omises (mix énergétique) ?” → Oui, limite assumée. Extension future avec contrôles

“Projection post-COVID ?” → Non modélisé (scénario tendanciel, pas de chocs)

“Pourquoi les USA ?” → Données longues (T=30), économie mature, cas test EKC idéal

“Biais pollution haven ?” → Reconnu. Empreinte carbone (imports-exports) serait meilleure mais moins de données

Annexes

📊 A1. Statistiques descriptives

Variable Moyenne Écart-type Min Q1 Médiane Q3 Max
CO₂/hab (t) 4.95 5.12 0.03 1.21 3.08 6.89 37.29
PIB/hab ($) 18,473 20,115 661 3,892 11,045 26,384 116,935
ln(CO₂) 1.18 1.23 -3.51 0.19 1.13 1.93 3.62
ln(PIB) 9.41 1.35 6.49 8.27 9.31 10.18 11.67

Échantillon : 159 pays, année 2020

🧮 A2. Formules des estimateurs

Estimateur

\hat{\beta} = (X'X)^{-1}X'Y

Variance HC3

\widehat{\text{Var}}_{HC3}(\hat{\beta}) = (X'X)^{-1} \left(\sum_{i=1}^n \frac{\hat{\varepsilon}_i^2}{(1-h_{ii})^2} x_i x_i'\right) (X'X)^{-1}

h_{ii} = levier de l’observation i

Variance HAC

\widehat{\text{Var}}_{NW}(\hat{\beta}) = (X'X)^{-1} \hat{\Omega} (X'X)^{-1}

avec

\hat{\Omega} = \hat{\Gamma}_0 + \sum_{j=1}^L \left(1 - \frac{j}{L+1}\right) (\hat{\Gamma}_j + \hat{\Gamma}_j')

Choix de L : L \approx \lfloor 4(T/100)^{2/9} \rfloor → L=3 pour T=30

Spécification ARDL(1,1)

Y_t = \rho Y_{t-1} + \beta_0 X_t + \beta_1 X_{t-1} + \varepsilon_t

Paramètres structurels

  • Élasticité CT : \varepsilon_{CT} = \beta_0
  • Élasticité LT : \varepsilon_{LT} = \frac{\beta_0 + \beta_1}{1 - \rho} (si |\rho| < 1)
  • Demi-vie : H = \frac{\ln(0.5)}{\ln(\rho)}

📉 A3. Tests de spécification

Régression auxiliaire

\Delta y_t = \alpha + \beta t + \gamma y_{t-1} + \sum_{i=1}^p \delta_i \Delta y_{t-i} + \varepsilon_t

Hypothèses

  • H_0 : \gamma = 0 (racine unitaire → non-stationnaire)
  • H_1 : \gamma < 0 (stationnaire)

Règle : Si stat. t < valeur critique (ou p < 0.05) → rejeter H_0

Statistique

F = \frac{(SSR_r - SSR_u)/q}{SSR_u/(n-k-1)} \sim F(q, n-k-1)

où : - SSR_r = somme carrés résidus (modèle contraint) - SSR_u = somme carrés résidus (modèle non-contraint) - q = nombre de contraintes

Formule

AIC = 2k - 2\ln(\hat{L})

où : - k = nombre de paramètres - \hat{L} = vraisemblance maximale

Interprétation : Plus bas = meilleur (pénalise la complexité)

🔬 A4. Validation Box-Cox

Principe : Déterminer la transformation optimale de Y

Y^{(\lambda)} = \begin{cases} \frac{Y^\lambda - 1}{\lambda} & \text{si } \lambda \neq 0 \\ \ln(Y) & \text{si } \lambda = 0 \end{cases}

Résultats

Paramètre Valeur
\lambda optimal 0.15
Distance à log (\lambda=0) 0.15
Distance à linéaire (\lambda=1) 0.85

Conclusion : Transformation logarithmique fortement justifiée

📐 A5. Validation non-paramétrique (LOWESS)

📂 Voir le code de validation
from statsmodels.nonparametric.smoothers_lowess import lowess
import matplotlib.pyplot as plt
import numpy as np

# Modèles paramétriques (si pas déjà estimés)
if 'm_quad' not in locals():
    m_quad = smf.ols('log_co2 ~ log_gdp_c + I(log_gdp_c**2)', data=df_cross).fit(cov_type='HC3')
    m_cub = smf.ols('log_co2 ~ log_gdp_c + I(log_gdp_c**2) + I(log_gdp_c**3)', data=df_cross).fit(cov_type='HC3')

# LOWESS (non-paramétrique)
lowess_result = lowess(df_cross['log_co2'], df_cross['log_gdp_c'], frac=0.3)

Résultat de la validation

Objectif : Vérifier que la forme quadratique n’est pas trop restrictive

Méthode : LOWESS (Locally Weighted Scatterplot Smoothing) — régression non-paramétrique qui laisse les données “parler d’elles-mêmes”

Résultat : - ✅ Le modèle quadratique suit bien la tendance LOWESS - ✅ Le modèle cubique n’apporte rien (superposition quasi-parfaite) - ⚠️ Aux très hauts revenus (>80k $/hab), légère divergence → hétérogénéité masquée

Conclusion : La spécification quadratique est robuste et parcimonieuse

📚 Références clés

Fondations théoriques - Grossman, G. M., & Krueger, A. B. (1995). Economic Growth and the Environment. QJE. - Stern, D. I. (2004). The Rise and Fall of the Environmental Kuznets Curve. World Development.

Critiques méthodologiques - Wagner, M. (2008). The Carbon Kuznets Curve: A Cloudy Picture Emitted by Bad Econometrics?. Resource and Energy Economics. - Peters, G. P., et al. (2011). Growth in emission transfers via international trade. PNAS.

Extensions récentes - Allard, A., et al. (2018). The N-shaped environmental Kuznets curve. Economics Letters.

Méthodes économétriques - Pesaran, M. H., et al. (2001). Bounds testing approaches to the analysis of level relationships. Journal of Applied Econometrics. - Newey, W. K., & West, K. D. (1987). A Simple, Positive Semi-Definite, Heteroskedasticity and Autocorrelation Consistent Covariance Matrix. Econometrica.